---
title: TextNodeRenderer 文本节点渲染器
icon: Code
relatedFile: app/src/core/render/canvas2d/entityRenderer/textNode/TextNodeRenderer.tsx
---

这个服务用于在画布上渲染 TextNode 类型的节点，包括节点的形状、文本内容以及各种状态下的视觉反馈。它基于 `Project` 实例来访问渲染器、相机、样式管理器等核心组件，从而实现节点的精确绘制和交互反馈。

## API

### `renderTextNode(node: TextNode): void`

这个方法负责渲染 TextNode 的整体视觉表现。

-   **节点主体渲染**:
    -   根据节点的 `color` 属性设置填充颜色。
    -   如果相机缩放比例小于 `Settings.ignoreTextNodeTextRenderLessThanCameraScale` 且节点颜色透明，则使用半透明的 `StageObjectBorder` 颜色作为填充。
    -   根据 `Settings.showTextNodeBorder` 决定是否渲染边框，边框颜色基于 `StageObjectBorder`。
    -   使用 `shapeRenderer` 绘制节点的矩形主体，并根据相机缩放调整大小和圆角。
-   **文本层渲染**:
    -   当相机缩放比例大于 `Settings.ignoreTextNodeTextRenderLessThanCameraScale` 时，调用 `renderTextNodeTextLayer` 方法渲染节点内部的文本内容。
-   **选中状态渲染**:
    -   如果节点处于选中状态 (`node.isSelected` 为 true)，则使用 `collisionBoxRenderer` 绘制一个选中框。
    -   如果节点大小调整模式为 "manual"，则绘制一个可拖拽的调整大小手柄矩形。
-   **AI 生成状态渲染**:
    -   如果节点处于 AI 生成状态 (`node.isAiGenerating` 为 true)，则绘制一个动态闪烁的边框，边框颜色和宽度随机变化，以表示正在生成中。
-   **标签节点放大显示 (已注释)**:
    -   代码中包含一段已注释的逻辑，用于在相机缩放比例较小时，将标签节点放大显示，包括放大背景矩形和文本。这部分功能目前被禁用。
-   **实体细节渲染**:
    -   当相机缩放比例大于 `Settings.ignoreTextNodeTextRenderLessThanCameraScale` 时，调用 `entityRenderer` 渲染节点的额外细节。

### `renderTextNodeTextLayer(node: TextNode): void`

这个私有方法专门用于绘制 TextNode 的文本内容层。

-   **编辑状态处理**:
    -   如果节点处于编辑状态 (`node.isEditing` 为 true)，则当前不渲染文本，并注释掉了显示提示信息的逻辑。
-   **文本内容判断与渲染**:
    -   如果 `node.text` 为 `undefined`，则在节点中心渲染字符串 "undefined"。
    -   **逻辑节点识别**:
        -   检查 `node.text` 是否为已知的逻辑节点名称（通过 `autoComputeUtils.isNameIsLogicNode` 判断）。
        -   如果识别为逻辑节点，则遍历 `LogicNodeNameToRenderNameMap` 查找对应的渲染名称，并在节点中心渲染该渲染名称。
        -   如果 `node.text` 是一个逻辑节点名称但未在 `LogicNodeNameToRenderNameMap` 中找到（可能是版本过低），则渲染原始文本，并额外绘制一个随机闪烁的红色边框以示警告。
    -   **普通文本渲染**:
        -   对于非逻辑节点的普通文本，使用 `textRenderer` 渲染多行文本。
        -   文本的起始位置、字体大小、颜色等都根据节点属性和相机缩放进行调整。
        -   如果节点大小调整模式为 "manual"，则文本的渲染宽度受节点矩形宽度限制，否则为无限宽。
